﻿
int count = 100_0000;

int total = 0;

//新增一个object对象
object obj = new object();

Thread thread1 = new Thread(IncrementFunc);
Thread thread2 = new Thread(IncrementFunc);

thread1.Start();
thread2.Start();

//Join方法是为了阻塞主线程，等待thread1,thread2线程都执行完后再执行后面
//的    Console.WriteLine($"total:{total}");  
thread1.Join();
thread2.Join();

//由于count++ 不是原子操作，多个线程同时修改 total 会导致
//total的值小于200_0000
Console.WriteLine($"total:{total}");
Console.ReadLine();

//该方法体的结果不正确,count++不是原子操作
//void IncrementFunc()
//{
//    for(int i=1;i<=count;i++)
//    {
//        total++;
//    }
//}



//以下方法能够得到正确结果(加锁)
//void IncrementFunc()
//{
//    for(int i=1;i<=count;i++)
//    {
//        //对该对象加锁
//        lock(obj)
//        {
//            total++;
//        }
//    }
//}

//以下方法能够得到正确结果(原子操作)
void IncrementFunc()
{
    for (int i = 1; i <= count; i++)
    {
        Interlocked.Increment(ref total);
    }
}

